/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package admin;

import controladores.ControladorSesion;
import entidades.Sesion;
import entidades.Usuario;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;

/**
 *
 * @author fcarou
 */
public class AdminSesion
{
    private Sesion sesion;
    
    public AdminSesion ()
    {
        cerrarSesionGuardada();
        iniciarSesion();
    }
    
    public final Sesion iniciarSesion ()
    {
        if (sesionIniciada())
            return null;
        
        Usuario usuario = getUsuarioGuardado();
        if (usuario == null)
            return null;
        
        ControladorSesion con = new ControladorSesion();
        sesion = con.iniciarSesion(usuario.getUsuario(), usuario.getClave(), true);
        
        guardarDatosSesion();
        
        return sesion;
    }
    
    public Sesion iniciarSesion (Usuario usuario, boolean recordar)
    {
        if (sesionIniciada())
            return null;
        
        eliminarDatosUsuario();
        
        ControladorSesion con = new ControladorSesion();
        
        sesion = con.iniciarSesion(usuario.getUsuario(), usuario.getClave(), true);
        
        if (sesion == null)
            return null;
        
        if (recordar)
            guardarUsuario(usuario);
        
        guardarDatosSesion();
        
        return sesion;
    }
    
    public boolean cerrarSesion (boolean borrarUsuario)
    {
        if (!sesionIniciada())
            return false;
        
        ControladorSesion con = new ControladorSesion();
        
        if (con.cerrarSesion(sesion.getCodigo()))
        {
            if (borrarUsuario)
                eliminarDatosUsuario();
            
            return borrarArchivoSesion();
        }
        
        return false;
    }
    
    private boolean borrarArchivoSesion ()
    {
        try
        {
            File file = new File ("sesion");
            
            if (!file.exists())
                return false;
            
            return file.delete();
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * Cierra la sesion guardada localmente.
     * @return true si el archivo existía y se pudo cerrar.
     */
    private boolean cerrarSesionGuardada ()
    {
        try
        {
            File file = new File ("sesion");
            
            if (!file.exists())
                return false;
            
            BufferedReader br = new BufferedReader(new FileReader(file));
            
            String codigo = br.readLine();
            
            br.close();
            
            ControladorSesion con = new ControladorSesion();
            con.cerrarSesion(codigo);
            file.delete();
            
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * Obtiene el usuario almacenado localmente.
     * @return el usuario, si el archivo existia. null en otro caso.
     */
    private Usuario getUsuarioGuardado ()
    {
        try
        {
            File file = new File ("usuario");
            
            if (!file.exists())
                return null;
            
            BufferedReader br = new BufferedReader(new FileReader(file));
            
            Usuario usuario = new Usuario(br.readLine(), br.readLine());
            
            br.close();
            
            return usuario;
        }
        catch (Exception e)
        {
            return null;
        }
    }
    
    /**
     * Almacena localmente los datos de un usuario.
     * @param usuario el usuario a guardar.
     * @return true si se pudo guardar.
     */
    public boolean guardarUsuario (Usuario usuario)
    {
        try
        {
            File file = new File ("usuario");
            PrintWriter pw = new PrintWriter(file);
            
            pw.println(usuario.getUsuario());
            pw.println(usuario.getClave());
            
            pw.close();
            
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * Elimina los datos del usuario almacenados localmente.
     * @return true si se pudo eliminar.
     */
    public boolean eliminarDatosUsuario ()
    {
        try
        {
            File file = new File ("usuario");
            
            if (file.exists())
                file.delete();
            
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * Almacena localmente el codigo de la sesion activa.
     * @return true si la sesion estaba activa y pudo ser guardada.
     */
    private boolean guardarDatosSesion ()
    {
        try
        {
            if (!sesionIniciada())
                return false;
            
            File file = new File ("sesion");
            PrintWriter pw = new PrintWriter(file);
            
            pw.println(sesion.getCodigo());
            pw.close();
            
            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    
    /**
     * Indica si la sesion ya esta iniciada o no.
     * @return true si lo esta.
     */
    public boolean sesionIniciada ()
    {
        return sesion != null;
    }
    
    public Sesion getSesion ()
    {
        return sesion;
    }
}
